package com.yuw.hashmapdemo;

import java.util.HashMap;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.ConcurrentHashMap;

public class TestDriver {

	public static void main(String[] args) {
		test03();

	}

	/**
	 * HashMap的使用
	 */
	private static void test03() {
		// HashMap元素的存储和读取操作
		// 创建一个HashMap的是实例对象
		// 面向接口的编程：左侧是接口父类，右侧是实现子类的实例对象（多态：父类指代子类）
		Map map = new TreeMap();
		// 存入键值对 （姓名-年龄）
		map.put("zhangsan", 30);
		map.put("lisi", 20);
		map.put("lisi", 40);//
		//map.put(null, 10);
		map.put("wangwu", 18);

		System.out.println("增强型的for循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 取出HashMap集合中的Key元素集合
		Set setKeys = map.keySet();
		// 把对map的遍历转变为对keyset集合的遍历，然后使用get方法获取与key对应的value值
		for (Object key : setKeys) {
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}

		System.out.println("使用迭代器循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 获取当前集合对象的迭代器对象
		Iterator it = setKeys.iterator();
		// 迭代器的 hasNext方法判定有么有下一个元素对象；
		// 迭代器的 next方法获取下一个元素对象，并将迭代器迭代位置（指针）向后挪动一个偏移量
		while (it.hasNext()) {
			// 取出当前遍历的key的值
			Object key = it.next();
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}

		System.out.println("增强型的for循环遍历取出HashMap集合中的Entry元素集合进行遍历：");

		Set setEntries = map.entrySet();

		// 增强型的for循环遍历set（存储了entry键值对的set）

		for (Object objEntry : setEntries) {
			// 从键值对中获取key的值
			Object key = ((Map.Entry) objEntry).getKey();
			// 从键值对中获取value的值
			Object val = ((Map.Entry) objEntry).getValue();
			// 输出信息
			System.out.println(key + " -- " + val);
		}
		
		// TODO 使用迭代器的方式遍历键值对entry的set集合，进而打印map中的所有键值对的值
		
	}

	/**
	 * HashMap的使用
	 */
	private static void test02() {
		// HashMap元素的存储和读取操作
		// 创建一个HashMap的是实例对象
		// 面向接口的编程：左侧是接口父类，右侧是实现子类的实例对象（多态：父类指代子类）
		Map map = new LinkedHashMap();
		// 存入键值对 （姓名-年龄）
		map.put("zhangsan", 30);
		map.put("lisi", 20);
		map.put("lisi", 40);//
		map.put(null, 10);
		map.put("wangwu", 18);

		System.out.println("增强型的for循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 取出HashMap集合中的Key元素集合
		Set setKeys = map.keySet();
		// 把对map的遍历转变为对keyset集合的遍历，然后使用get方法获取与key对应的value值
		for (Object key : setKeys) {
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}

		System.out.println("使用迭代器循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 获取当前集合对象的迭代器对象
		Iterator it = setKeys.iterator();
		// 迭代器的 hasNext方法判定有么有下一个元素对象；
		// 迭代器的 next方法获取下一个元素对象，并将迭代器迭代位置（指针）向后挪动一个偏移量
		while (it.hasNext()) {
			// 取出当前遍历的key的值
			Object key = it.next();
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}

		System.out.println("增强型的for循环遍历取出HashMap集合中的Entry元素集合进行遍历：");

		Set setEntries = map.entrySet();

		// 增强型的for循环遍历set（存储了entry键值对的set）

		for (Object objEntry : setEntries) {
			// 从键值对中获取key的值
			Object key = ((Map.Entry) objEntry).getKey();
			// 从键值对中获取value的值
			Object val = ((Map.Entry) objEntry).getValue();
			// 输出信息
			System.out.println(key + " -- " + val);
		}
		
		// TODO 使用迭代器的方式遍历键值对entry的set集合，进而打印map中的所有键值对的值
		
	}

	/**
	 * HashMap的使用
	 */
	private static void test01() {
		// HashMap元素的存储和读取操作
		// 创建一个HashMap的是实例对象
		// 面向接口的编程：左侧是接口父类，右侧是实现子类的实例对象（多态：父类指代子类）
		Map map = new HashMap();
		
		new ConcurrentHashMap();
		// 存入键值对 （姓名-年龄）
		map.put("zhangsan", 30);
		map.put("lisi", 20);
		map.put("lisi", 40);//
		map.put(null, 10);
		map.put("wangwu", 18);

		System.out.println("增强型的for循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 取出HashMap集合中的Key元素集合
		Set setKeys = map.keySet();
		// 把对map的遍历转变为对keyset集合的遍历，然后使用get方法获取与key对应的value值
		for (Object key : setKeys) {
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}

		System.out.println("使用迭代器循环遍历取出HashMap集合中的Key元素集合进行遍历：");
		// 获取当前集合对象的迭代器对象
		Iterator it = setKeys.iterator();
		// 迭代器的 hasNext方法判定有么有下一个元素对象；
		// 迭代器的 next方法获取下一个元素对象，并将迭代器迭代位置（指针）向后挪动一个偏移量
		while (it.hasNext()) {
			// 取出当前遍历的key的值
			Object key = it.next();
			// 通过key取出value值
			Object val = map.get(key);
			// 输出信息
			System.out.println(key + " -- " + val);
		}
	}
}
